home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mission 3
/
Mission 3.zip
/
Mission 3.iso
/
demovers
/
scripter
/
demo
/
plotter.sic
< prev
next >
Wrap
Text File
|
1998-09-26
|
2KB
|
119 lines
//ACE-SICPAR 8 0043
/*
* Ein kleiner ASCII-Funktionsplotter (c) 17.7.97 Christian Wempe
*/
uses "math.lib";
uses "io.lib";
const SCREEN_WIDTH = 72;
const SCREEN_HEIGHT = 20;
/*
* Hauptfunktion
*/
proc main(...)
local i;
{
printf("Zeichnet eine Funktion im Bereich -5 bis 5\n");
/*
* Eingeben der Funktion
*/
func = "";
printf("Funktion f(x) eingeben: ");
input(func);
translate(f, "", "return " + func + ";");
/*
* Das Array initialisieren (erzeugen)
*/
screen.length = SCREEN_WIDTH;
for (i = 0; i < SCREEN_WIDTH; ++i)
screen[i].length = SCREEN_HEIGHT;
printf("\nFunktion: %s\nBitte warten...\n", func);
precision(10);
/*
* Hier wird geplottet. Parameter: Xmin, Xmax, Ymin [, Yscale]
* Soll ein anderer Bereich gezeichnet werden, oder die Funktion in
* Y-Richtung gedehnt oder gestaucht werden, müssen die Parameter hier
* geändert werden.
*/
plot(-5.0, 5.0, -1.0);
}
/*
* Einen Punkt im Screen-Array setzen
*/
proc plotXY(x, y)
local ix, iy, pix;
{
x -= x_offset;
y -= y_offset;
ix = int(round(x / width));
iy = int(round((y / width) * y_scale));
pix = '*';
if (iy < 0) iy = 0, pix = 'v'; // Funktionswert zu klein
if (iy > (SCREEN_HEIGHT-1)) iy = (SCREEN_HEIGHT-1), pix = '^'; // Funktionswert zu gross
screen[ix, iy] = pix;
}
/*
* Eine Funktion ins Array zeichnen und dann ausgeben
*/
proc plot(start, end, y_off, y_s = 1.0)
local i, j, line, x, y;
{
/*
* Zwei Sicherheitstests: Startwert sollte kleiner als Endwert sein
* und y nicht mit 0 skaliert werden.
*/
if (start >= end) throw("bad range", start, end);
if (y_s == 0) throw("bad scale", y_s);
/*
* Das Array mit Blanks initialisieren.
*/
for (i = 0; i < SCREEN_WIDTH; ++i)
for (j = 0; j < SCREEN_HEIGHT; ++j) screen[i, j] = ' ';
/*
* Variablen, die zum Zeichnen benoetigt werden, initialisieren.
*/
width = (end - start) / (SCREEN_WIDTH - 1);
x_offset = start;
y_offset = y_off;
y_scale = y_s;
/*
* Werte von <start> bis <end> berechnen und plotten
*/
for (x = start; x < end; x += width) {
y = f(x);
plotXY(x, y);
}
/*
* Fuer jede Zeile einen String basteln und dann ausgeben.
*/
for (j = SCREEN_HEIGHT - 1; j >= 0; --j) {
line = "";
for (i = 0; i < SCREEN_WIDTH; ++i) line[i] = screen[i, j];
print(line);
}
}
/*
* In diese Funktion wird der Ausdruck uebersetzt
*/
proc f(x)
{
return x;
}